/**
 * 10. 括号序列
 * https://www.lanqiao.cn/problems/1456/learning/?page=1&first_category_id=1&second_category_id=3&tag_relation=intersection&tags=2021,%E7%9C%81%E8%B5%9B
 */

import java.util.Scanner;

/**
 使得括号序列变得合法的话 需要满足：
 1、左右括号数相同
 2、任意前缀中的 左括号数不小于右括号数

 添加的左括号 和 右括号是独立的，互不干扰的，一定是和 原的序列进行匹配
 当添加的 左括号和右括号 放在同一个空隙中的时候，那么它们的序列一定是一种
 这个题就是 将左括号添加的个数 和 右括号添加的个数 分开来算之后 将它们进行相乘
 并且还需要进行保证 计算的结果是不重复的
 只需要保证只在 每一个右括号的前面添加左括号即可
 */
public class Main16 {
    public static final long MOD = (long) (1e9 + 7);
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //在此输入您的代码...
        // 使用dp解决问题
        // dp[i][j]: 表示 只考虑前i个括号，左括号比右括号多j个 的方案的数量
        // 状态分析：当s[i] = '(' 那么说明dp[i][j] 就是固定的，为dp[i - 1][j - 1]，因为dp[i][j] 是多j个，这个添加了1一个'('，那么找j-1即为j
        // 当s[i] = ')' 时候要分析dp[i][j]这个里面添加了几个左括号，0个的话，即为dp[i - 1][j + 1] 个，以为多个')'，要和'('抵消一个，那么j需要为j+1个，所以为dp[i - 1][j + 1]个
        // 依此类推那么1个即为 dp[i - 1][j] ；2个即为dp[i - 1][j - 1] 和')'相消一个，还存在一个，那么就需要在前面少找一个，最后到dp[i - 1][0]
        // dp[i][j] = dp[i - 1][j + 1] + dp[i - 1][j] + dp[i - 1][j - 1] + dp[i - 1][j - 2] .... dp[i - 1][0]
        // dp[i][j - 1] = dp[i - 1][j] + dp[i - 1][j - 1] + dp[i - 1][j - 2] + dp[i - 1][j - 3] .... dp[i - 1][0]
        // 那么原dp[i][j] = dp[i - 1][j + 1] + dp[i][j - 1]
        String str = scan.next();
        long left = cale(str); // 先计算一开始给的，也就是左括号
        // 之后进行翻转，重新计算，将左括号变成右括号，将右括号变成左括号，也就是计算右括号
        StringBuffer string = new StringBuffer(str);
        // 翻转
        string.reverse();
        // 将括号转换
        for(int i = 0;i < string.length();i++) {
            if(string.charAt(i) == '(') {
                string.setCharAt(i,')');
            }else {
                string.setCharAt(i,'(');
            }
        }
        long right = cale(string.toString());
        System.out.println((left * right) % MOD);
        scan.close();
    }

    public static long cale(String str) {
        int n = str.length();
        long[][] dp = new long[n + 2][n + 2]; // 防止越界访问
        dp[0][0] = 1; // 进行初始化
        for(int i = 1;i <= n;i++) {
            if(str.charAt(i - 1) == '(') {
                for(int j = 1;j <= n;j++) {
                    dp[i][j] = dp[i - 1][j - 1];
                }
            }else {
                // 先进行判断0这个，因为可能越界，所以进行特判
                dp[i][0] = (dp[i - 1][1] + dp[i - 1][0]) % MOD;
                for(int j = 1;j <= n;j++) {
                    dp[i][j] = (dp[i - 1][j + 1] + dp[i][j - 1]) % MOD;
                }
            }
        }
        //从小往大括号数递增，第一个非零方案对应的状态就是最少括号数的”恰好“合法串
        for(int i = 0;i < n;i++) {
            if(dp[n][i] != 0) {
                return dp[n][i];
            }
        }
        return -1;
    }
}
